\chapter{端到端的验证码识别}\label{chap:cnn}
随着传统图形验证码越来越复杂（如图\ref{fig:qzxk}），加入了图形噪点干扰和字符旋转变形扭曲的图形验证码,正逐渐取代可分割验证码的主流地位。
因此传统的图形验证码识别算法已经越来越不通用，越来越“无用武之地”了。
不过当一种领域或分支出现衰落或下降的趋势时，往往另一种全新的领域正在迅速诞生崛起。

\begin{figure}[!htbp]
  \centering
  \includegraphics[clip, width=0.20\textwidth]{qzxk}
  \bicaption{某教务系统的选课验证码}{Verification code of a educational administration system}
  \label{fig:qzxk}
\end{figure}

幸运的是，当人们发现传统的基于图像数字特征的验证码识别规则越来越无力应对新兴的图形验证码技术时，一种全新的机器学习算法正在飞速发展起来。
这便是基于深度学习技术的神经网络。神经网络是以生物的单个神经元为原型启发，构建的一种复杂函数网络，简言之就是模拟了生物神经系统各个神经元之间的紧密联系，构建的分层的复杂函数网络。
正是因为神经网络的出现，当代机器视觉技术出现了飞跃式的快速发展，当今，诸如自动驾驶、文字识别、人脸识别和物体检测的技术，都在神经网络的基础上得到了长足的发展，各种应用层出不穷，充满活力，前景光明。

在卷积神经网络（CNN）、循环神经网络（RNN）和对抗神经网络（GAN）等当代深度神经网络模型的帮助下，传统的图形验证码甚至无需任何预处理，即可被提前训练好的模型成功识别破解，本章我们就开始探索搭建一个卷积神经网络，尝试对不可分割验证码进行端到端的直接识别。

\section{TensorFlow深度学习框架简介}

TensorFlow是一个端到端的开源机器学习平台。它拥有一个包含各种工具、库和社区资源的全面灵活生态系统，可以让研究人员推动机器学习领域的先进技术的发展，并让开发者轻松地构建和部署由机器学习提供支持的应用\citep{tensorflow}。

\begin{figure}[h]
  \centering
  \includegraphics[clip, width=0.4\textwidth]{tensorflow}
  \bicaption{TensorFlow}{An end-to-end open source machine learning platform}
  \label{fig:tensorflow}
\end{figure}

Tensorflow拥有多层级结构，可部署于各类服务器、PC终端和网页并支持GPU和TPU高性能数值计算，被广泛应用于谷歌内部的产品开发和各领域的科学研究。

鉴于TensorFlow以上的各种优点，这里我们选择它作为将要搭建的基于卷积神经网络(CNN)的图形验证码的端到端识别模型的计算框架。

\section{卷积神经网络模型搭建}
卷积神经网络（Convolutional Neural Networks, CNN）是一类包含卷积计算且具有深度结构的前馈神经网络（Feedforward Neural Networks），是深度学习（deep learning）的代表算法之一\citep{cnn}。

这里我们不再赘述卷积神经网络的数学推导过程，而是直接给出所用模型的组成结构，并使用TensorFlow机器学习框架搭建该模型。

\begin{table}[!htbp]
  \bicaption{模型结构}{Structure of the model}
  \centering
  \footnotesize% fontsize
  \setlength{\tabcolsep}{4pt}% column separation
  \renewcommand{\arraystretch}{1.2}%row space 
  \begin{tabular}{|c|c|}
    \hline
    序号 & 层级                              \\
    \hline
    输入 & input                             \\
    1    & 卷积层 + 池化层 + 降采样层 + ReLU \\
    2    & 卷积层 + 池化层 + 降采样层 + ReLU \\
    3    & 卷积层 + 池化层 + 降采样层 + ReLU \\
    4    & 全连接 + 降采样层 + Relu          \\
    5    & 全连接 + softmax                  \\
    输出 & output                            \\
    \hline
  \end{tabular}
\end{table}

\section{GPU模型训练与识别}

考虑到本地并未有足够强大的算力资源，为了保证模型训练的速度，这里选择将模型迁移到kaggle云端GPU服务器环境进行快速模型训练。

\begin{figure}[h]
  \centering
  \includegraphics[clip, width=0.6\textwidth]{acc}
  \bicaption{训练数据统计图}{Training data statistics}
  \label{fig:acc}
\end{figure}

\section{识别结果}

在实际操作中发现在经过3000轮左右的训练后，图像验证码训练数据集的识别率就已经达到了80\%（图\ref{fig:acc}），最终该模型使用20000张图形验证码经过大约10000轮的训练后达到了99\%的验证码识别准确率，可以说已经解决了此类验证码的机器识别问题。

